const koa = require('koa');
const koaBody = require('koa-body');
const koaJwt = require('koa-jwt');
let indexRoutes = require('./routes');
const Variable = require('./utils/variable');
const { secret } = Variable;
const checkToken = require('./middleware/checkToken');

var server = new koa();

// 错误处理中间件
server.use(async (ctx, next) => {
    try {
        await next();
    } catch (error) {
        // 响应用户
        ctx.status = error.statusCode || error.status || 500;
        ctx.body = error.message;
        // 触发应用层级错误事件
        ctx.app.emit('error', error);
    }
});

// token验证是否过期或失效
server.use(checkToken);

// 对注册和登录接口的过滤，也就是说注册和登录接口不需要jwt的验证
server.use(koaJwt({
    secret
}).unless({
    // 除了注册和登录接口，其他它接口都需要JWT授权验证
    path: [/^\/api\/user\/reg/, /^\/api\/user\/login/, /^\/api\/up\/token/]
}));

// 接收POST数据
server.use(koaBody());

// 放到其他中间件的后面
indexRoutes(server);

// 全局错误事件监听
server.on('error', error => {
    console.error(error);
});

// 语法糖, 等同于http.createServer(server.callback()).listen(8080);
server.listen(8080, () => {
    console.log('服务器已开启，监听在8080端口');
});
